package com.sisgesbyte.services.proyeccion;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.inject.Inject;

import com.sisgesbyte.common.ConstModAdministracion;
import com.sisgesbyte.common.ConstProyeccion;
import com.sisgesbyte.common.ConstantesInternasSistema;
import com.sisgesbyte.common.Validaciones;
import com.sisgesbyte.dao.administracion.MantCategoriaProductoDao;
import com.sisgesbyte.dao.administracion.MantenimientoMarcaDao;
import com.sisgesbyte.dao.beanDao.FiltrosBean;
import com.sisgesbyte.dao.beanDao.FiltrosSQLBean;
import com.sisgesbyte.dao.beanDao.ProyeccionGeneralRequest;
import com.sisgesbyte.dao.proyeccion.MantProyeccionProductoGeneralDao;
import com.sisgesbyte.data.entity.administracion.CategoriaProductoEntity;
import com.sisgesbyte.data.entity.administracion.MarcaEntity;
import com.sisgesbyte.data.entity.comun.GenericEntity;
import com.sisgesbyte.data.entity.proyeccion.ProyeccionProductoGeneralEntity;
import com.sisgesbyte.services.commonBean.GenericResponse;
import com.sisgesbyte.services.proyeccion.bean.ListaProyGeneralCategoriaResponse;
import com.sisgesbyte.services.proyeccion.bean.ListaProyGeneralMarcasResponse;
import com.sisgesbyte.services.proyeccion.bean.ListaProyeccionGeneralResponse;
import com.sisgesbyte.services.proyeccion.bean.ProyGeneralCategoriaBean;
import com.sisgesbyte.services.proyeccion.bean.ProyeccionGeneralBean;
import com.sisgesbyte.services.proyeccion.bean.ProyeccionGeneralMarcasBean;

@Stateless
public class MantProyeccionGeneralServiceImpl implements
		MantProyeccionGeneralService {

	@EJB
	private MantProyeccionProductoGeneralDao mantProyeccionProductoGeneralDao;
	@EJB
	private MantenimientoMarcaDao mantenimientoMarcaDao;
	@EJB
	private MantCategoriaProductoDao mantCategoriaProductoDao;
	@Inject
	private Validaciones validaciones;
	private List<CategoriaProductoEntity> listaHijosCategoriaProd;
	private List<CategoriaProductoEntity> hijos;

	@Override
	public ListaProyeccionGeneralResponse mostrarProyeccionGeneral(
			String codTransaccion, String txtBuscar) {
		String mensajeTransaccionMetodo = "[mostrarProyeccionGeneral idTx="
				+ codTransaccion + "] - ";
		ListaProyeccionGeneralResponse response = new ListaProyeccionGeneralResponse();

		List<ProyeccionProductoGeneralEntity> listaProyeccion = null;
		try {
			FiltrosSQLBean filtroSQL = new FiltrosSQLBean();
			if (txtBuscar != null) {
				if (txtBuscar.trim().length() > 0) {
					List<Object> valores = new ArrayList<>();
					List<FiltrosBean> filtro = new ArrayList<FiltrosBean>();
					FiltrosBean listaCampo = new FiltrosBean();
					List<String> campo = new ArrayList<String>();
					campo.add("m.marca");
					campo.add("cp.nombre");
					campo.add("p.cod_prod");
					campo.add("p.producto");
					campo.add("ppg.codigo_banda");
					listaCampo.setCampos(campo);
					listaCampo.setOperador("like");
					filtro.add(listaCampo);
					filtroSQL.setListaFiltros(filtro);
					valores.add("%" + txtBuscar + "%");
					filtroSQL.setListaValores(valores);
					filtroSQL.setCampoOrden("ppg.id");
					filtroSQL.setTipoOrden("desc");
				}else{
					filtroSQL = null;
				}
			} else {
				filtroSQL = null;
			}

			listaProyeccion = mantProyeccionProductoGeneralDao.listaProyeccionProductoGeneral(filtroSQL);
		} catch (Exception e) {
			System.out.println(mensajeTransaccionMetodo + "Hubo un error al listar de  BD " + e);
			response.setCodigoRespuesta(ConstProyeccion.PROYECCION_LISTAR_COD_IDT);
			response.setMensajeRespuesta(ConstProyeccion.PROYECCION_LISTAR_MSJ_IDT);
			return response;
		}
		List<ProyeccionGeneralBean> listaProyeccionGeneral = new ArrayList<ProyeccionGeneralBean>();
		if (listaProyeccion.size() > 0) {
				BigDecimal montoTotal =BigDecimal.ZERO;
			for (ProyeccionProductoGeneralEntity ls : listaProyeccion) {
				ProyeccionGeneralBean bean = new ProyeccionGeneralBean();
				bean.setMarcaId(ls.getMarca_id());
				bean.setMarca(validaciones.validarCamposString(ls.getMarca()));
				bean.setCantidadProyectada(ls.getCantidad_proyectada());
				bean.setCategoria(validaciones.validarCamposString(ls.getCategoria()));
				bean.setCategoriaProductoId(ls.getCategoria_producto_id());
				bean.setCodigoBanda(validaciones.validarCamposString(ls.getCodigo_banda()));
				bean.setCodProd(validaciones.validarCamposString(ls.getCod_prod()));
				bean.setId(ls.getId());
				bean.setProducto(validaciones.validarCamposString(ls.getProducto()));
				bean.setProductoId(ls.getProducto_id());
				bean.setPrecioPromedio(ls.getPrecio_promedio());
				try{
					bean.setMontoProyeccion(ls.getPrecio_promedio().multiply(ls.getCantidad_proyectada()));
				}catch(Exception e){
					bean.setMontoProyeccion(BigDecimal.ZERO);
				}
				try{
					montoTotal = montoTotal.add(ls.getCantidad_proyectada().multiply(ls.getCantidad_proyectada()));
				}catch(Exception e){
					montoTotal = BigDecimal.ZERO;
				}
				
				listaProyeccionGeneral.add(bean);
			}
			response.setIdTransaccion(codTransaccion);
			response.setCodigoRespuesta(ConstantesInternasSistema.CODIGO_EXITO);
			response.setMensajeRespuesta(ConstantesInternasSistema.MENSAJE_EXITO);
			response.setMontoTotalProyeccion(montoTotal);
			response.setListaProyeccionGeneral(listaProyeccionGeneral);
		} else {
			response.setIdTransaccion(codTransaccion);
			response.setCodigoRespuesta(ConstProyeccion.PROYECCION_LISTAR_COD_IDF);
			response.setMensajeRespuesta(ConstProyeccion.PROYECCION_LISTAR_MSJ_IDF);
		}

		return response;
	}

	@Override
	public GenericResponse nuevaProyeccionGeneral(String codTransaccion,
			ProyeccionGeneralBean request) {
		String mensajeTransaccionMetodo = "[nuevaProyeccionGeneral idTx="
				+ codTransaccion + "] - ";
		GenericResponse response = new GenericResponse();
		GenericEntity responseDao = null;
		try {
			ProyeccionGeneralRequest req = new ProyeccionGeneralRequest();
			req.setIdProducto(request.getProductoId());
			req.setCodigoBanda(validaciones.validarCamposString(request
					.getCodigoBanda()));
			req.setCantidadProyectada(request.getCantidadProyectada());

			responseDao = mantProyeccionProductoGeneralDao
					.guardarProyeccionGeneral(req);

			if (responseDao.getCod_error() == Integer
					.parseInt(ConstantesInternasSistema.CODIGO_EXITO)) {
				response.setCodigoRespuesta(ConstantesInternasSistema.CODIGO_EXITO);
				response.setMensajeRespuesta(ConstantesInternasSistema.MENSAJE_EXITO);
			} else {
				response.setCodigoRespuesta(String.valueOf(responseDao.getCod_error()));
				response.setMensajeRespuesta(responseDao.getMsj_error());
			}
		} catch (Exception e) {
			System.out.println(mensajeTransaccionMetodo
					+ "Hubo un error al registrar la Proyeccion en BD " + e);
			response.setCodigoRespuesta(ConstModAdministracion.MANT_NUEVO_COD_IDT);
			response.setMensajeRespuesta(ConstModAdministracion.MANT_NUEVO_MSJ_IDT
					.replace("msj", mensajeTransaccionMetodo));
		}
		return response;
	}

	@Override
	public GenericResponse editarProyeccionGeneral(String codTransaccion,
			ProyeccionGeneralBean request) {
		String mensajeTransaccionMetodo = "[editarProyeccionGeneral idTx="
				+ codTransaccion + "] - ";
		GenericResponse response = new GenericResponse();
		GenericEntity responseDao = null;
		try {
			ProyeccionGeneralRequest req = new ProyeccionGeneralRequest();
			req.setId(request.getId());
			req.setIdProducto(request.getProductoId());
			req.setCodigoBanda(validaciones.validarCamposString(request
					.getCodigoBanda()));
			req.setCantidadProyectada(request.getCantidadProyectada());

			responseDao = mantProyeccionProductoGeneralDao
					.actualizarProyeccionGeneral(req);

			if (responseDao.getCod_error() == Integer
					.valueOf(ConstantesInternasSistema.CODIGO_EXITO)) {
				response.setCodigoRespuesta(ConstantesInternasSistema.CODIGO_EXITO);
				response.setMensajeRespuesta(ConstantesInternasSistema.MENSAJE_EXITO);
			} else {
				response.setCodigoRespuesta(String.valueOf(responseDao
						.getCod_error()));
				response.setMensajeRespuesta(responseDao.getMsj_error());
			}

		} catch (Exception e) {
			System.out.println(mensajeTransaccionMetodo
					+ "Hubo un error al editar  en BD " + e);
			response.setCodigoRespuesta(ConstModAdministracion.MANT_EDITAR_COD_IDT);
			response.setMensajeRespuesta(ConstModAdministracion.MANT_EDITAR_MSJ_IDT
					.replace("msj", mensajeTransaccionMetodo));
		}
		return response;
	}

	@Override
	public GenericResponse deleteProyeccionGeneral(String codTransaccion,
			int codProyeccion) {
		String mensajeTransaccionMetodo = "[deleteProyeccionGeneral idTx="
				+ codTransaccion + "] - ";
		GenericResponse response = new GenericResponse();
		GenericEntity responseDao = null;
		try {
			responseDao = mantProyeccionProductoGeneralDao
					.eliminarProyeccionGeneral(codProyeccion);
			if (responseDao.getCod_error() == Integer
					.valueOf(ConstantesInternasSistema.CODIGO_EXITO)) {
				response.setCodigoRespuesta(ConstantesInternasSistema.CODIGO_EXITO);
				response.setMensajeRespuesta(ConstantesInternasSistema.MENSAJE_EXITO);
			} else {
				response.setCodigoRespuesta(ConstModAdministracion.MANT_ELIMINAR_COD_IDF);
				response.setMensajeRespuesta(ConstModAdministracion.MANT_ELIMINAR_MSJ_IDF
						.replace("msj", mensajeTransaccionMetodo));
			}
		} catch (Exception e) {
			System.out.println(mensajeTransaccionMetodo
					+ "Hubo un error al eliminar  en BD " + e);
			response.setCodigoRespuesta(ConstModAdministracion.MANT_EDITAR_COD_IDT);
			response.setMensajeRespuesta(ConstModAdministracion.MANT_EDITAR_MSJ_IDT
					.replace("msj", mensajeTransaccionMetodo));
		}
		return response;
	}

	@Override
	public ListaProyGeneralMarcasResponse mostrarProyGeneralMarcas(
			String codTransaccion) {
		
		String mensajeTransaccionMetodo = "[mostrarProyGeneralMarcas idTx=" + codTransaccion + "] - ";
		
		ListaProyGeneralMarcasResponse response = new ListaProyGeneralMarcasResponse();

		List<ProyeccionProductoGeneralEntity> listaProyeccion = null;
		try{
			//1.- obtenemos las lista de proyecciones general
			listaProyeccion = mantProyeccionProductoGeneralDao.listaProyeccionProductoGeneral(null);
		}catch(Exception e){
			System.out.println(mensajeTransaccionMetodo + "Hubo un error al listar las proyecciones generales de  BD " + e);
			response.setCodigoRespuesta(ConstProyeccion.PROYECCION_LISTAR_COD_IDT);
			response.setMensajeRespuesta(ConstProyeccion.PROYECCION_LISTAR_MSJ_IDT);
			return response;
		}

		List<MarcaEntity> marcasDao = null;
		try{
			//2.- obtenemos la lista de marcas de productos
			marcasDao = mantenimientoMarcaDao.listaMarcas(null);
		}catch(Exception e){
			System.out.println(mensajeTransaccionMetodo + "Hubo un error al listar la lista de marcas de productos de  BD " + e);
			response.setCodigoRespuesta(ConstProyeccion.PROYECCION_LISTAR_COD_IDT);
			response.setMensajeRespuesta(ConstProyeccion.PROYECCION_LISTAR_MSJ_IDT);
			return response;
		}
		List<ProyeccionGeneralMarcasBean> listaMarcasProy = new ArrayList<ProyeccionGeneralMarcasBean>();
		for(MarcaEntity marca : marcasDao){
			ProyeccionGeneralMarcasBean bean = new ProyeccionGeneralMarcasBean();
			bean.setIdMarca(marca.getId());
			bean.setMarca(validaciones.validarCamposString(marca.getMarca()));
			
			BigDecimal total = BigDecimal.ZERO;
			for(ProyeccionProductoGeneralEntity proy : listaProyeccion){
				if(marca.getId() == proy.getMarca_id()){
					total = total.add(proy.getCantidad_proyectada().multiply(proy.getPrecio_promedio()));
				}
			}
			bean.setMontoTotal(total);
			if(total.compareTo(BigDecimal.ZERO) > 0){
				listaMarcasProy.add(bean);
			}
		}
		if (listaMarcasProy.size() > 0) {
			response.setCodigoRespuesta(ConstantesInternasSistema.CODIGO_EXITO);
			response.setMensajeRespuesta(ConstantesInternasSistema.MENSAJE_EXITO);
			response.setListaProyeccionGeneralMarcas(listaMarcasProy);
		} else {
			response.setCodigoRespuesta(ConstModAdministracion.MANT_ELIMINAR_COD_IDF);
			response.setMensajeRespuesta(ConstModAdministracion.MANT_ELIMINAR_MSJ_IDF.replace("msj", mensajeTransaccionMetodo));
		}
		return response;
	}

	@Override
	public ListaProyGeneralCategoriaResponse mostrarProyGeneralCategoria(
			String codTransaccion) {
		String mensajeTransaccionMetodo = "[mostrarProyGeneralCategoria idTx=" + codTransaccion + "] - ";
		
		ListaProyGeneralCategoriaResponse response = new ListaProyGeneralCategoriaResponse();
		
		List<ProyeccionProductoGeneralEntity> listaProyeccion = null;
		try{
			//1.- obtenemos las lista de proyecciones general
			listaProyeccion = mantProyeccionProductoGeneralDao.listaProyeccionProductoGeneral(null);
		}catch(Exception e){
			System.out.println(mensajeTransaccionMetodo + "Hubo un error al listar las proyecciones generales de  BD " + e);
			response.setCodigoRespuesta(ConstProyeccion.PROYECCION_LISTAR_COD_IDT);
			response.setMensajeRespuesta(ConstProyeccion.PROYECCION_LISTAR_MSJ_IDT);
			return response;
		}
		
		List<CategoriaProductoEntity> listaCategoriaProd = null;
		try{
			
			//2.- obtenemos la lista de categoria de productos
			listaCategoriaProd = mantCategoriaProductoDao.listarCategoriasProd(null);
			this.listaHijosCategoriaProd = listaCategoriaProd;
		}catch(Exception e){
			System.out.println(mensajeTransaccionMetodo + "Hubo un error al listar las proyecciones de categorias productos de  BD " + e);
			response.setCodigoRespuesta(ConstProyeccion.PROYECCION_LISTAR_COD_IDT);
			response.setMensajeRespuesta(ConstProyeccion.PROYECCION_LISTAR_MSJ_IDT);
			return response;
		}
		List<ProyGeneralCategoriaBean> listaCategoriaProy = new ArrayList<ProyGeneralCategoriaBean>();
		for(CategoriaProductoEntity categoria : listaCategoriaProd){
			ProyGeneralCategoriaBean bean = new ProyGeneralCategoriaBean();
			bean.setId(categoria.getId());
			bean.setCategoria(categoria.getNombre());
			bean.setIdPadre(categoria.getPadre_id());
			
			hijos = new ArrayList<CategoriaProductoEntity>();
			//agregamos al padre
			hijos.add(categoria);
			//buscamos sus hijos
			capturarHijos(categoria.getId());
			//buscamos los montos de todos sus hijos
			BigDecimal total = BigDecimal.ZERO;
			for(CategoriaProductoEntity h :hijos){
				for(ProyeccionProductoGeneralEntity proy : listaProyeccion){
					if(h.getId() == proy.getCategoria_producto_id()){
						total =total.add(proy.getPrecio_promedio().multiply(proy.getCantidad_proyectada()));
					}
				}
			}
			
			bean.setMontoTotal(total);
			
			if(total.compareTo(BigDecimal.ZERO) > 0){
				listaCategoriaProy.add(bean);
			}
		}

		if (listaCategoriaProy.size() > 0) {
			response.setCodigoRespuesta(ConstantesInternasSistema.CODIGO_EXITO);
			response.setMensajeRespuesta(ConstantesInternasSistema.MENSAJE_EXITO);
			response.setListaProyGeneralCategoria(listaCategoriaProy);
		} else {
			response.setCodigoRespuesta(ConstModAdministracion.MANT_ELIMINAR_COD_IDF);
			response.setMensajeRespuesta(ConstModAdministracion.MANT_ELIMINAR_MSJ_IDF.replace("msj", mensajeTransaccionMetodo));
		}
		return response;
	}
	
	public void capturarHijos(int idPadre){
		for(CategoriaProductoEntity hijo :listaHijosCategoriaProd){
			if(idPadre == hijo.getPadre_id()){
				hijos.add(hijo);
				capturarHijos(hijo.getId());
			}
		}
	}
}
